#ifndef SINGLETON_H
#define SINGLETON_H

/**
 * Template permettant de limiter le nombre d'instance d'un objet à
 * un.
 *
 * @author Johan "Solo" Luisier
 * @date 29 février 2012
 */
template <class T>
class Singleton
{
 public:
  /**
   * Permet de récupérer l'instance de l'objet. Si l'objet n'existe
   * pas, alors il est créé dynamiquement.
   *
   * @return un pointeur sur l'instance voulue.
   */
  static T* instance()
  {
    if( Instance == 0 ) Instance = new T;
    return Instance;
  }
  /**
   * Permet de libérer la mémoire allouée pour conserver l'instance.
   */
  static void tueInstance()
  {
    if ( Instance != 0 )
      {
	delete Instance;
	Instance = 0;
      }
  }
 protected:
  Singleton();
  ~Singleton();
 private:
  Singleton( Singleton const& );
  Singleton& operator=( Singleton const& );
  static T* Instance;
};

template <class T> T* Singleton<T>::Instance( 0 );

#endif // SINGLETON_H
